#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <dirent.h>
#include <vector>
#include <string>
#include "work.h"
#include "conf.h"
#include "pdf.h"
#include "cmp.h"

using namespace std;

/* 计时器处理函数 */
void timer_handle(int x);
/* 获取日期 */
string get_date();
/* 检测文件夹 */
vector<string> check_file(const char *dirname);
/* 文件比较 */
void cmpare(int idx);

/* 实验列表 */
vector<string> subdir_list;
/* 每个实验中的子目录，即每个实验的学生列表 */
vector<vector<string> > exp_list;
/* 存储每个实验检测结果 */
vector<vector<string> > copy_list;

/* 开始比较 */
int work_start()
{
    /* 获取实验列表 */
    subdir_list = check_file("homework");
    copy_list.resize(subdir_list.size());
    exp_list.resize(subdir_list.size());
    for(int i = 0; i < subdir_list.size(); ++i)
    {
        exp_list[i] = check_file(("homework/" + subdir_list[i]).c_str());
    }
    /* 开始运行时对所有实验进行一次抄袭检查 */
    for(int i = 0; i < subdir_list.size(); ++i)
    {
        cmpare(i);
    }

    /* 定时任务 */
    signal(SIGALRM, timer_handle);
    alarm(conf_get_delay());
    return 0;
}

void timer_handle(int x)
{
    vector<string> tmp;
    
    puts("start check");

    for(int i = 0; i < subdir_list.size(); ++i)
    {
        /* 重新列出学生 */
        tmp = check_file(("homework/" + subdir_list[i]).c_str());
        /* 比较文件列表时候改变 */
        if(tmp.size() != exp_list[i].size())
        {
            /* 发生改变则对该实验运行抄袭检查 */
            exp_list[i] = tmp;
            cmpare(i);
        }
    }

    puts("check completed");

    /* 重置定时 */
    alarm(conf_get_delay());
}

/* 获取日期 */
string get_date()
{
    time_t t;
    time(&t);
    char str[16];
    strftime(str, sizeof(str), "%G%m%d", localtime(&t));
    return str;
}

vector<string> check_file(const char *dirname)
{
    vector<string> now_list;
    DIR *d;
    d = opendir(dirname);
    if(NULL == d)
    {
        return now_list;
    }
    struct dirent *ent;
    while(ent = readdir(d))
    {
        if(0 == strcmp(ent->d_name, ".") || 0 == strcmp(ent->d_name, ".."))
        {
            continue;
        }
        now_list.push_back(ent->d_name);
    }
    return now_list;
}

/* 文件比较 */
void cmpare(int idx)
{
    puts("cmpare start ");
    puts(subdir_list[idx].c_str());
    copy_list[idx].clear();
    copy_list[idx].push_back(subdir_list[idx]);
    /* 对list中的学生作业执行检测 */
    for(int i = 0; i < exp_list[idx].size(); ++i)
    {
        string p1 = "homework/" + subdir_list[idx] + "/" + exp_list[idx][i] + "/index.html";
        for(int j = i + 1; j < exp_list[idx].size(); ++j)
        {
            string p2 = "homework/" + subdir_list[idx] + "/" + exp_list[idx][j] + "/index.html";
            int v = cmp_compare(p1, p2);
            if(v > conf_get_value())
            {
                copy_list[idx].push_back(exp_list[idx][i] + " - " + exp_list[idx][j] + " - " + to_string(v) + "%");
            }
        }
    }
    copy_list[idx].push_back("-------------");
    puts("cmpare end");
}

/* 输出PDF */
string work_out_pdf()
{
    string filename("ret/Analysis-");
    filename.append(get_date());
    filename.append(".pdf");
    vector<string> content;
    content.push_back("AnAnalysis-" + get_date());
    content.push_back("-------------");
    for(int i = 0; i < subdir_list.size(); ++i)
    {
        content.insert(content.end(), copy_list[i].begin(), copy_list[i].end());
    }
    mypdf_out(filename, content, 25, 20, 50);
    return filename;
}